# 歌手的歌单列表
# 爬虫webdriver
from selenium import webdriver
# WebDriverWait的等待时间
from selenium.webdriver.support.wait import WebDriverWait
#
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time, requests


def spider_singerlist(url):
    # 创建一个浏览器对象
    browser = webdriver.Chrome()
    # 设置等待浏览器加载的最长时间
    wait = WebDriverWait(browser, timeout=0.5)
    try:
        #
        browser.get(url)
        # 休眠时间
        time.sleep(0.2)
        #selenium定位页面元素的时候会遇到定位不到的问题
        frame1 = browser.find_element(By.ID,'g_iframe')
        # 用id来定位转到frame1页面
        browser.switch_to.frame(frame1)
        # 时间休眠
        time.sleep(0.2)
        # 页面滚动
        js = """
            window.scrollTo(0,5000)
        """
        # 滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制滚动条，这时候只能借助JS了，还好selenium提供了一个操作js的方法:
        # execute_script()，可以直接执行js的脚本。
        a = browser.execute_script(js)
        time.sleep(0.2)

        # 定义Infos存储需要返回的数据（图片链接和歌曲信息）
        Infos = []
        # 获取上一级所需歌手图片
        singer_pic = browser.find_element(By.CSS_SELECTOR, '.n-artist img')
        singer_pic = singer_pic.get_attribute('src')
        Infos.append(singer_pic)
        songs_url = browser.find_elements(By.CSS_SELECTOR, '.ttc span a')
        songs_name = browser.find_elements(By.CSS_SELECTOR, '.ttc span a b')
        songs_time = browser.find_elements(By.CLASS_NAME, 'u-dur ')
        songs_album = browser.find_elements(By.CSS_SELECTOR, '.w4 div a')
        time.sleep(0.2)

        # 定义songInfo存储从歌手歌单链接爬取的数据
        # 遍历每一个歌手，取里面的信息
        songInfo = []
        for i in range(0, len(songs_url)):
            # 获取这个歌手的歌曲的链接
            song_herf = songs_url[i].get_attribute('href')
            # 获取歌曲的id
            song_id = song_herf.split('=')[-1]
            # 获取歌曲的名字
            song_name = songs_name[i].get_attribute('title')
            # 获取时长
            song_time = songs_time[i].text
            song_album = songs_album[i].get_attribute('title')
            # 获取歌曲的而链接，把song_id拼接上
            song_download_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)
            # 一首歌的完整信息（歌曲id,名字，链接，时长，专辑，播放链接）
            one_song = {'song_id': song_id, 'song_name': song_name, 'song_href': song_herf, 'song_time': song_time, 'song_album': song_album, 'song_download_url': song_download_url}
            # 添加到歌曲列表内
            songInfo.append(one_song)
        Infos.append(songInfo)
        # print(Infos)
        return Infos

        # return Infos
    finally:
        # 退出
        browser.quit()


if __name__ == '__main__':
    # 初始化时的链接
    spider_singerlist('https://music.163.com/#/artist?id=10559')

